//这里封装了一些js工具函数
//可在页面内的js内单文件引入也可在main.js内全局应用

/**
 *标题长度处理
 *@param {string} text 标题
 *@param {number} len 长度
 *@param {number} type true不带电/false带点
 *@returns stext 字符串
 */
export const sliceStr = (text, len, type) => {
	if (!noNull(text) || !noNull(len)) {
		return ''
	}
	let stext = text.slice(0, len)
	if (!type) {
		if (text.length > len) {

			stext += '...'

		}
	}
	return stext
}
/**
 *标题长度处理
 *@param {object} data 要处理的参数
 *@param {number} filter 过滤参
 *@param {number} type remove 移除过滤参 默认留下过滤参
 *@param {boolean} switch_json 是否转json 默认不转
 *@returns params 参数
 */
export const setParams = (data, filter, type, switch_json) => {
	if (!noNull(data)) return logs('请输入要处理的参数')
	if (seeType(data) !== 'Object') return logs('只处理Object类型')
	if (seeType(filter == 'Array')) {
		let justData = {}
		let wipeOffData = {}
		let params = {}
		Object.keys(data).map(item => {
			if (filter.indexOf(item) != -1) justData[item] = data[item]
			if (filter.indexOf(item) == -1) wipeOffData[item] = data[item]
		})
		if (type == 'remove') {
			params = wipeOffData
		} else {
			params = justData
		}
		if (switch_json) return JSON.stringify(params)
		return params
	} else {
		return logs('过滤参数请传入Array类型')
	}

}

/**
 *倒计时计算（距今）
 *@param {string} time 年月日/年月日时分秒
 *@returns {number} data 秒
 */
export const dTime = (time) => {
	if (!noNull(time)) return;
	let timeNum = (new Date(time.replace(/-/g, "/")).getTime() - new Date().getTime()) / 1000

	if (timeNum > 0) {
		return Number(timeNum.toFixed(0))
	} else {
		return 0
	}
}

/**
 *轻提示
 *@param {string} data 要提示的字符串
 *@param {number} type 打印类型1=>success;2=>loading;默认none
 */
export const toast = (data, type) => {
	if (!noNull(data)) return;
	let toastType = 'none';
	switch (type) {
		case 1:
			toastType = 'success';
			break;
		case 2:
			toastType = 'loading';
			break;
		default:
			toastType = 'none';
	}
	return uni.showToast({
		icon: toastType,
		title: data
	})
}

/**
 *自定义log
 *@param {string} data 要打印的字符
 *@param {number} type 打印类型1=>成功;2=>失败;3=>警告;4=>自定义;默认0
 */
export const logs = (data, type = 0) => {
	if (!noNull(data)) return;


	let color = "#3C9CFF"
	let face = '(๑╹◡╹)ﾉ'
	switch (type) {
		case 1:
			color = '#04C160';
			face = "(๑╹◡╹)ﾉ"
			break;
		case 2:
			color = '#F56C6C';
			face = "(╬￣皿￣)=○"
			break;
		case 3:
			color = '#F9AE3D';
			face = "(⊙_⊙)"
			break;
		case 4:
			//自定义
			color = '#0AB99C';
			face = "(～￣▽￣)～"
			break;
	}
	if (seeType(data) != 'String') {
		console.log(`\n %c ${face} \r 输出数据如下 \n \n`,
			`color: #ffffff; background:${color}; padding:5px 0; border-radius:5px`, data)
	} else {
		console.log(`\n %c ${face} \r ${data} \n`,
			`color: #ffffff; background:${color}; padding:5px 0; border-radius:5px`)
	}

}

/**
 *深拷贝
 *@param {any} data 要深拷贝的值
 *@returns {any} params 
 */
export const copy = (data) => {
	if (!noNull(data)) return;
	let params = JSON.parse(JSON.stringify(data))
	return params
}

/**
 *00取整
 *@param {string} data 如20.00
 *@returns {string} text 20
 */
export const briefNum = (data = 0) => {
	if (!noNull(data)) {
		return ''
	}
	if (Number(data) > Math.floor(data)) {
		return data
	} else {
		return Math.floor(data)
	}
}
/**
 *复制到剪切板
 *@param {string} data 要设置到剪切板的值
 */
export const copyData = (data) => {
	uni.setClipboardData({
		data: String(data),
		success: () => {
			toast('已复制')
		}
	})

}
/**
 *判断是否不为空
 *@param {any} data 
 *@returns {boolean} true/false
 */

export const noNull = (data) => {
	if (Array.isArray(data)) {
		if (data.length > 0) {
			return true;
		} else {
			return false;
		}
	}
	if (JSON.stringify(data) == "{}") {
		return false;
	}
	switch (data) {
		case null:
			return false;
		case '':
			return false;
		case undefined:
			return false;
		default:
			return true;
	}
}

/**
 *去空
 *@param {string} data 
 *@returns {string} data
 */
export const wipeOutn = (data) => {
	if (!noNull(data)) return
	return data.replace(/\s/g, "")
}
/**
 *跳转
 *@param {string} url 路径如 "/pages/index/index"
 *@param {string} type 传入 "clear" 时清空其余页面
 *@param {number} delay 延时n秒后跳转
 */
export const navto = (data, type, delay = 0) => {
	if (!noNull(data)) return
	setTimeout(() => {
		if (type == "clear") {
			uni.reLaunch({
				url: data
			})
		} else if (type == "close") {
			uni.redirectTo({
				url: data
			})
		} else {
			uni.navigateTo({
				url: data,
				fail: () => {
					uni.switchTab({
						url: data,
						fail: () => {
							logs('请填写正确路径', 2)
						}
					})
				}
			})
		}
	}, delay * 1000)

}

/**
 *返回
 *@param {number} page 回退页数
 *@param {any} data 写入缓存的值 key为 backData
 *@param {number} delay 延时n秒后跳转
 */
export const onBreak = (page = 1, data, delay = 0) => {
	if (data) {
		uni.setStorageSync('backData', data)
	}
	setTimeout(() => {
		uni.navigateBack({
			delta: page
		})
	}, delay * 1000)

}

/**
 *查看图片
 *@param {object} data 数组或路径
 *@param {number} index 若为数组当前图片下标
 */
export const seeImgArr = (data, index = 0) => {
	if (!noNull(data)) return;
	let images = []
	if (seeType(data) === "Array") {
		images = data
	} else {
		if (String(data).indexOf('http') == -1) return logs(`路径错误---当前路径为"${data}"(请使用网络资源)`, 2);
		images.push(data)
	}
	uni.previewImage({
		urls: images,
		current: index,
		fail: (err) => {
			logs(err, 2)
		}
	})
}

/**
 *字符串抓取手机号
 *@param {string} str 字符串
 *@returns {string} phone_number 手机号
 */
export const strPhone = (str) => {

	if (typeof str == "string") {
		var regx = /(1[3|4|5|7|8][\d]{9}|0[\d]{2,3}-[\d]{7,8}|400[-]?[\d]{3}[-]?[\d]{4})/g;
		var phoneNums = str.match(regx);
		var temp = ''
		if (phoneNums) {
			for (var i = 0; i < phoneNums.length; i++) {
				temp = phoneNums[i]
			}
		}
		return temp;
	}
}

/**
 *验证账号
 *@param {string} str 字符串是否为数字加字母组合
 *@returns {boolean} true/fasle 
 */
export const rulesCode = (str) => {
	if (!noNull(str)) return;
	let strTemp = /^[A-Za-z0-9]+$/;
	return strTemp.test(str)
}

/**
 *验证手机号
 *@param {string} str 字符串
 *@returns {boolean} true/fasle 
 */
export const rulesPhone = (str) => {
	if (!noNull(str)) return false;
	let strTemp = /^1[3|4|5|6|7|8|9][0-9]{9}$/;
	return strTemp.test(str)
}
/**
 *拨打电话
 *@param {phone} phone 电话号码
 */
export const callPhone = (phone) => {
	if (!noNull(phone)) logs('电话号码不正确', 2)
	uni.makePhoneCall({
		phoneNumber: phone,
		fail: (err) => {
			toast("已取消");
			console.error(err)
		}
	})
}

/**
 *类型判断
 *@param {any} data 判断参数
 *@returns {string} data 类型 字符串首字母大写如 Array
 */
export const seeType = (data) => {
	let type = Object.prototype.toString.call(data)
	type = wipeOutn(type)
	return type.slice(7, type.length - 1)
}

/**
 *数组删除
 *@param {Array} arr 要删除的数组
 *@param {Array} indexList 要删除的数组下标
 *@returns {Array} array 返回处理后的数组
 */
export const arrDelete = (arr = [], indexList = []) => {
	if (seeType(arr) != 'Array' || seeType(indexList) != 'Array') {
		logs('传入值非"Array"', 2)
	} else {
		if (!noNull(arr)) return logs('请传入要删除的数组', 2);
		if (noNull(indexList)) {
			let num = 0
			for (let i of indexList) {
				arr.splice(i - num, 1)
				num++
			}
		} else {
			logs('请传入要删除的数组下标', 2)
		}
	}
	return arr
}

/**
 *顶部高度
 *@returns {number} 顶部高度
 */
export const navheight = () => {
	let res = uni.getSystemInfoSync();
	let isIos = res.system.indexOf('iOS') > -1;
	let height = isIos ? 44 : 48
	let navHeight = height + res.statusBarHeight;
	return navHeight
}

/**
 *间转化
 *@param {Date} dates 时间
 *@param {string} fmt 格式 'yyyy-MM-dd HH:mm:ss'
 *@returns {string} fmt 格式处理后的时间
 */
export const Format = (dates = new Date(), fmt = 'yyyy-MM-dd HH:mm:ss') => {
	var o = {
		"M+": dates.getMonth() + 1, //月份 
		"d+": dates.getDate(), //日 
		"H+": dates.getHours(), //小时 
		"m+": dates.getMinutes(), //分 
		"s+": dates.getSeconds(), //秒 
		"q+": Math.floor((dates.getMonth() + 3) / 3), //季度 
		"S": dates.getMilliseconds() //毫秒 
	};
	if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (dates.getFullYear() + "").substr(4 - RegExp.$1.length));
	for (var k in o)
		if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : ((
			"00" + o[k]).substr(("" + o[k]).length)));
	return fmt;
}
